﻿using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace Snake1._0
{
    public class CorpoSnake : GameComponent
    {
        private LinkedList<PedacoSnake> _pedacosSnake;
        private DirecaoSnake _direcao;
        private float _velocidade = 10f;
        private float _time = 0;

        public DirecaoSnake Direcao
        {
            get { return _direcao; }
            set { _direcao = value; }
        }

        public CorpoSnake(Game game)
            : base(game)
        {
            _pedacosSnake = new LinkedList<PedacoSnake>();

            Direcao = DirecaoSnake.Direita;

            var cabeca = new PedacoSnake(game, new Vector2(30f, 10f));
            cabeca.IsCabeca = true;

            _pedacosSnake.AddFirst(cabeca);

            AdicionaPedaco();
            AdicionaPedaco();
        }

        /// <summary>
        /// Cria um pedaço no final da cobra
        /// </summary>
        public void AdicionaPedaco()
        {
            // Cria um pedaço a partir do último.
            var ultimoPedaco = _pedacosSnake.Last;
            ultimoPedaco.Value.IsRabo = false;

            var novoPedaco = new PedacoSnake(Game, ultimoPedaco.Value.Posicao);
            novoPedaco.IsRabo = true;
            
            _pedacosSnake.AddAfter(ultimoPedaco, novoPedaco);
        }        

        public override void Update(GameTime gameTime)
        {
            _time += (float)gameTime.ElapsedGameTime.TotalSeconds;
            
            if (_time > 0.2f)
            {
                // varre de baixo para cima pegando a posição do antecessor
                var nodo = _pedacosSnake.Last;

                for (int index = 0; index < _pedacosSnake.Count - 1; index++)
                {
                    nodo.Value.Posicao = nodo.Previous.Value.Posicao;
                    nodo = nodo.Previous;
                }

                nodo = _pedacosSnake.First;

                if (_direcao == DirecaoSnake.Cima)
                    nodo.Value.Posicao = new Vector2(nodo.Value.Posicao.X, nodo.Value.Posicao.Y - _velocidade);
                else if (_direcao == DirecaoSnake.Baixo)
                    nodo.Value.Posicao = new Vector2(nodo.Value.Posicao.X, nodo.Value.Posicao.Y + _velocidade);
                else if (_direcao == DirecaoSnake.Esquerda)
                    nodo.Value.Posicao = new Vector2(nodo.Value.Posicao.X - _velocidade, nodo.Value.Posicao.Y);
                else if (_direcao == DirecaoSnake.Direita)
                    nodo.Value.Posicao = new Vector2(nodo.Value.Posicao.X + _velocidade, nodo.Value.Posicao.Y);

                _time = 0;
            }

            foreach (PedacoSnake pedaco in _pedacosSnake)
            {
                pedaco.Update(gameTime);
            }            
        }

        public void Draw(GameTime gameTime)
        {
            foreach (PedacoSnake pedaco in _pedacosSnake)
            {
                pedaco.Draw(gameTime);
            }
        }
    }

    public enum DirecaoSnake
    {
        Cima,
        Baixo,
        Direita,
        Esquerda
    }
}
